﻿<!DOCTYPE html>
<html lang="zh">
<head>
 <meta charset="utf-8">
 <title>CSS制作垂直布局的表单_揭秘CSS世界-歪脖网</title>
 <meta name="keywords" content="CSS, CSS3, 揭秘CSS, , 垂直布局的表单,CSS制作垂直布局的表单" />
 <meta name="description" content="CSS制作垂直布局的表单" />
 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" />
 <link href="http://localhost/waibo/css/bootstrap.min.css" rel="stylesheet" />
 <link href="http://localhost/waibo/css/bootstrap-responsive.min.css" rel="stylesheet" />
 <link href="http://localhost/waibo/css/style.css" rel="stylesheet" />

 <script src="http://localhost/waibo/js/jquery.js"></script>
 <script src="http://localhost/waibo/js/script.js"></script>
</head>

<body>
 <div class="topbar">
 <div class="eyebrow hidden-phone">
 <div class="container">
 <ul class="pull-left">
   <li><a href="http://www.waibo.wang/" target="_blank">歪脖网</a>欢迎您！</li>
 </ul>
 <ul class="pull-right">
  <li><a href="http://www.waibo.wang/user/">登录</a></li>
  <li class="b">|</li>
  <li><a href="http://www.waibo.wang/user/register.asp" target="_blank">注册</a></li>
 </div>
 </div>

<div class="topnav">
<div class="container">
  <div class="row-fluid mtz">
  <div class="span3 topnav-logo">
    <a href="http://www.waibo.wang/"><p class="logo-cn">歪脖网</p><p class="logo-en hidden-phone">waibo.wang</p></a>
  </div>
  <div class="span6 nav">
   <ul>
     <li ><a href="http://www.waibo.wang/">首页</a></li>
     <li class="active"><a href="http://localhost/waibo/bible/">教程</a></li>
     <li ><a href="http://www.waibo.wang/wiki/">专栏</a></li>
     <li ><a href="http://www.waibo.wang/demo/">素材</a></li>
     <li ><a href="http://www.waibo.wang/tools/">工具</a></li>
   </ul>
  </div>
  <div class="span3 topnav-form">
  </div>
 </div>
 </div>
 </div>
 </div>


 <div class="container">
 <div class="row-fluid bible">
 <aside class="span3">
 <map id="oAll" name="oAll">
 <area title="全部展开" shape="rect" coords="0,0,22,20"  href="javascript:tree.openAll();" onfocus="blur(this);">
 <area title="全部收起" shape="rect" coords="22,0,44,20" href="javascript:tree.closeAll();" onfocus="blur(this);">
 </map>
 <header><span>目录</span><img src="http://localhost/waibo/img/map.png" usemap="#oAll"/></header>
 <script src="http://localhost/waibo/js/dtree.js"></script>
 <script src="http://localhost/waibo/bible/css3/js/tree.js"></script>
 <script>
    createTree("70203");
 </script>
 </aside>

 <main class="span9">
 <header><div class="name"><strong>揭秘CSS</strong>(第 1 版)</div><div class="section">7.2.3 垂直布局的表单</div></header>
 <div><label id="treeview"><input id="show" type="checkbox" checked /> 文档结构视图</label><span class="hit">阅读（ <span id="hit"></span> ）</div>
 <article>
<h1 class="hide-text">概述</h1>
<h1 class="hide-text">CSS选择器</h1>
<h1 class="hide-text">字体和文本</h1>
<h1 class="hide-text">盒模型</h1>
<h1 class="hide-text">元素的定位</h1>
<h1 class="hide-text">链接和导航</h1>
<h1 class="hide-text">表格和表单</h1>
<h2 class="hide-text">表格</h2>
<h2 class="hide-text">表单</h2>
<h3 class="hide-text">水平布局的表单</h3>
<h3 class="hide-text">表单元素的样式</h3>
<h3>垂直布局的表单</h3>
<p>对于比较复杂的表单，要填写的内容相对较多，采用水平布局显然不合适。因此，垂直布局的表单更加常用。垂直对齐的表单中，标签和输入框可以使用三种对齐方式，包括顶对齐、左对齐和右对齐。</p>
<p>顶对齐可以缩短用户填写表单的时间，由于标签和输入框非常靠近，处理起来毫不费力，用户只需顺着表单向下移动，就可完成整个表单。如图 7‑22 所示：</p>
<figure><img src='http://localhost/waibo/bible/css3/img/7/form_vertical1.png' title='顶对齐的表单' alt='顶对齐的表单'><figcaption>图7-22  顶对齐的表单</figcaption></figure>
<p>但是，顶对齐的标签会占用额外的垂直空间。因此，如果可供使用的垂直屏幕空间较小，应当谨慎使用顶对齐标签。另外，顶对齐的表单还应当采用合适的垂直距离，输入框之间的垂直距离太小或太大都会影响填写。一般而言，最好使用输入框高度的50%到70%，作为相邻输入框的间距。</p>
<p>如果人们不熟悉表单要收集的数据，或者在逻辑上分组有困难，左对齐的标签浏览起来可能更容易。用户只需要上下看看左侧的标签就可以了，而不会被输入框打断思路。如图 7‑23 所示：</p>
<figure><img src='http://localhost/waibo/bible/css3/img/7/form_vertical2.png' title='左对齐的表单' alt='左对齐的表单'><figcaption>图7-23  左对齐的表单</figcaption></figure>
<p>左对齐可以占用较少的垂直屏幕空间，但有些长标签会增加标签和输入框之间的距离，用户必须左右来回跳转目光，来找到标签对应的输入框，因而影响填写表单的时间。</p>
<p>于是产生了一种替代的方案，右对齐标签的布局，它使得标签和输入框之间的联系更紧密，有助于快速填写表单。如图 7‑24 所示：</p>
<figure><img src='http://localhost/waibo/bible/css3/img/7/form_vertical3.png' title='右对齐的表单' alt='右对齐的表单'><figcaption>图7-24  右对齐的表单</figcaption></figure>
<p>然而，右对齐会导致左边参差不齐，会降低浏览表单的效率。对于西方国家，人们习惯于从左至右的书写，右对齐会给这些用户造成阅读障碍。</p>
<p>由此可知，三种对齐方式各有利弊，在实际应用中，到底采用哪种对齐方式，则由应用场景和具体的目标而定，不能一概而论。根据中文的语言习惯，以及大多数网站的情况，右对齐的表单比较常用。</p>
<p>接下来，通过一个实例，来简单介绍一下垂直布局表单的实现方法。众所周知，表格本身是一种网格结构，其最大特点是同一列都具有相同的宽度，因此，表格本身是一种很好的布局工具。</p>
<p>由于表单内容相对简单，每行一般只包含一项内容，都是在一个标签后，紧跟一项待填写的表单元素。因此，表单的就相当于 n 行两列的布局，一列是标签，一列是待填写的表单元素。</p>
<p>如果把表单的每一行放在一个块级容器中（如，div、p等），并让每一列都具有固定宽度，则表单的内容就具有表格的特点，其布局也就非常简单。</p>
<p>在表单元素中，label 元素默认生成一个行内框，其他元素则生成一个原子行内级框。因此，如果把 label 元素的 display 属性设置为 inline-block，它也会生成一个原子行内级框。这样的话，就可以为表单上的所有元素设置固定宽度，实现网格布局。</p>
<p>当然，对于复杂的表单，一行内可能有三列、四列，甚至更多列。无论有多复杂，都可以沿用这种思想，让每一列生成一个原子行内级框，来采用网格布局。如，以下表单：</p>
<pre class="prettyprint linenums">
<code>&lt;form action="" method="post"&gt;
    &lt;p&gt;&lt;label&gt;姓名: &lt;/label&gt;&lt;input type="text" name="name" /&gt;&lt;/p&gt;
    &lt;p&gt;&lt;label&gt;E-Mail: &lt;/label&gt;&lt;input type="email" name="email" /&gt;&lt;/p&gt;
    &lt;p&gt;&lt;label&gt;所在城市: &lt;/label&gt;
       &lt;select name="city"&gt;
           &lt;option value="1"&gt;北京&lt;/option&gt;
           &lt;option value="2"&gt;上海&lt;/option&gt;
       &lt;/select&gt;
    &lt;/p&gt;
    &lt;p&gt;&lt;label&gt;性别: &lt;/label&gt;
       &lt;input type="radio" name="sex" value="male" checked /&gt;男
       &lt;input type="radio" name="sex" value="female" /&gt;女
    &lt;/p&gt;
    &lt;p&gt;&lt;label&gt;个人爱好: &lt;/label&gt;
       &lt;input type="checkbox" name="music" value="music" checked /&gt;音乐
       &lt;input type="checkbox" name="swimming" value="swimming" /&gt;游泳
       &lt;input type="checkbox" name="football" value="football" checked /&gt;足球
       &lt;input type="checkbox" name="skating" value="skating" /&gt;轮滑
           &lt;/p&gt;
    &lt;p&gt;&lt;label&gt;自我介绍: &lt;/label&gt;&lt;textarea name="introduce" &gt;&lt;/textarea&gt;&lt;/p&gt;
&lt;/form&gt;</code></pre>
<p>在没有进行布局设计之前，运行结果如图 7‑25 所示：</p>
<figure><img src='http://localhost/waibo/bible/css3/img/7/form_vertical4.png' title='没有应用样式的表单' alt='没有应用样式的表单'><figcaption>图7-25  没有应用样式的表单</figcaption></figure>
<p>事实上，网格布局的核心，就是行和列的布局，行布局负责元素在行内的水平摆放整齐，列布局负责相同的列能够正确对齐。</p>
<p>首先，进行行格式化。为了防止行之间过于拥挤，可以为 p 元素添加 10px 的上下外边距。由于相邻的 p 元素会发生外边距合并，则所有行之间的距离都将是 10px。</p>
<pre class="prettyprint linenums">
<code>form p {
   margin: 10px 0;
}</code></pre>
<p>在一行内，如果 label 和 input 元素生成的框垂直居中对齐，会比较美观。这样的话，无论行有多高，这些元素会始终保持居中对齐。</p>
<pre class="prettyprint linenums">
<code>label, input {
   vertical-align: middle;
}</code></pre>
<p>其次，进行列格式化。列格式化的目的，是实现网格中列的对齐。如果相同的列都等宽的话，网格自然就会对齐。因此，只需把 label 元素的 display 属性设置为 inline-block，再为 label 和 input 元素设置合适的宽度，即可实现列的对齐。</p>
<pre class="prettyprint linenums">
<code>label {
   width: 80px;
   display: inline-block;
}
input {
   width: 240px;
}</code></pre>
<p>当为 input 元素设置宽度 240px 后，预览就会发现，所有的input 元素（如radio、checkbox、提交按钮等）的宽度都将变成 240px。</p>
<p>解决这个问题的一个办法是，使用属性选择器寻找特定类型的表单元素，专门设置宽度。如，专门设置文本输入框的宽度：</p>
<pre class="prettyprint linenums">
<code>input[type="text"] {
   width: 240px;
}</code></pre>
<p>或者如果希望大多数的 input 元素的宽度都是 240px，只有 radio 和 checkbox 使用其它宽度，则可以将这些元素的宽度设置为 auto，来覆盖前面对 input 元素的设置：</p>
<pre class="prettyprint linenums">
<code>input[type="radio"],
input[type="checkbox"] {
   width: auto;
}</code></pre>
<p>遗憾的是，属性选择器在IE6及更低版本中是无效的。因此，在属性选择器得到广泛支持之前，区分输入元素最好的方法，是给他们分配一个类。如，为单选按钮分配类名 radio，为复现框分配类名 checkbox：</p>
<pre class="prettyprint linenums">
<code>.radio, .checkbox {
   width: auto;
}</code></pre>
<p>再为 label元素设置&nbsp; text-align: right 来实现标签的右对齐，并通过右侧的外边距，使 label 和 input 之间保持适当的距离，防止标签和输入框过于拥挤。</p>
<pre class="prettyprint linenums">
<code>label {
   text-align: right;
   margin-right: 10px;
}</code></pre>
<p>好了，表单元素现在已经按照网格排列整齐。然后，再按照前面介绍的方法，对每个表单元素的细节进行处理，来实现需要的表单效果。运行结果如图 7‑26 所示：</p>
<figure><img src='http://localhost/waibo/bible/css3/img/7/form_vertical5.png' title='垂直布局的表单' alt='垂直布局的表单'><figcaption>图7-26  垂直布局的表单</figcaption></figure>
<p>从上图可以看出，本节所实现的表单非常朴素。这是因为本节的重点，是介绍表单的布局方法，而不是表单的美工方法。掌握基本布局方法之后，设计师可以充分发挥想象，通过更多的美工元素，来实现美轮美奂、精彩绝伦的表单。</p><div class="author">
<p class="about">关于作者</p>
<p><a href="https://weibo.com/leiqikui">歪脖先生</a>，十五年以上软件开发经验，酷爱Web开发，精通 HTML、CSS、JavaScript、jQuery、JSON、Python、Less、Bootstrap等，著有《<a href="http://www.waibo.wang/bible/html5/">HTML宝典</a>》、《<a href="http://www.waibo.wang/bible/css3/">揭秘CSS</a>》、《<a href="http://www.waibo.wang/bible/less/">Less简明教程</a>》、《<a href="http://www.waibo.wang/bible/bootstrap2/">Bootstrap2用户指南</a>》、《<a href="http://www.waibo.wang/bible/bootstrap3/">Bootstrap3实用教程</a>》、《<a href="http://www.waibo.wang/bible/bootstrap4/">Bootstrap4源码剖析</a>》，并全部在 <a href="https://github.com/leiqikui">GitHub</a> 上开源。</p>
</div>

<div id="modalReward" class="modal hide fade modal-reward" tabindex="-1">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">&times;</button>
<h6>打赏</h6>
</div>
<div class="modal-body">
<div class="tabbable reward-weipay">
<ul class="nav nav-tabs">
<li class="active"><a data-toggle="tab" href="#weipay1">￥1</a></li>
<li><a data-toggle="tab" href="#weipay2">￥2</a></li>
<li><a data-toggle="tab" href="#weipay5">￥5</a></li>
<li><a data-toggle="tab" href="#weipay10">￥10</a></li>
<li><a data-toggle="tab" href="#weipay20">￥20</a></li>
<li><a data-toggle="tab" href="#weipayrand">其他金额</a></li>
</ul>
<div class="tab-content">
<div class="tab-pane active" id="weipay1">
<img src="http://localhost/waibo/img/weipay1.png" alt="￥1"><span>￥1</span>
</div>
<div class="tab-pane" id="weipay2">
<img src="http://localhost/waibo/img/weipay2.png" alt="￥2"><span>￥2</span>
</div>
<div class="tab-pane" id="weipay5">
<img src="http://localhost/waibo/img/weipay5.png" alt="￥5"><span>￥5</span>
</div>
<div class="tab-pane" id="weipay10">
<img src="http://localhost/waibo/img/weipay10.png" alt="￥10"><span>￥10</span>
</div>
<div class="tab-pane" id="weipay20">
<img src="http://localhost/waibo/img/weipay20.png" alt="￥20"><span>￥20</span>
</div>
<div class="tab-pane" id="weipayrand">
<img src="http://localhost/waibo/img/weipayrand.png" alt="￥随意"><span>￥随意</span>
</div>
</div>
</div>
<div class="tabbable reward-alipay hide">
<ul class="nav nav-tabs">
<li class="active"><a data-toggle="tab" href="#alipay1">￥1</a></li>
<li><a data-toggle="tab" href="#alipay2">￥2</a></li>
<li><a data-toggle="tab" href="#alipay5">￥5</a></li>
<li><a data-toggle="tab" href="#alipay10">￥10</a></li>
<li><a data-toggle="tab" href="#alipay20">￥20</a></li>
<li><a data-toggle="tab" href="#alipayrand">其他金额</a></li>
</ul>
<div class="tab-content">
<div class="tab-pane active" id="alipay1">
<img src="http://localhost/waibo/img/alipay1.png" alt="￥1"><span>￥1</span>
</div>
<div class="tab-pane" id="alipay2">
<img src="http://localhost/waibo/img/alipay2.png" alt="￥2"><span>￥2</span>
</div>
<div class="tab-pane" id="alipay5">
<img src="http://localhost/waibo/img/alipay5.png" alt="￥5"><span>￥5</span>
</div>
<div class="tab-pane" id="alipay10">
<img src="http://localhost/waibo/img/alipay10.png" alt="￥10"><span>￥10</span>
</div>
<div class="tab-pane" id="alipay20">
<img src="http://localhost/waibo/img/alipay20.png" alt="￥20"><span>￥20</span>
</div>
<div class="tab-pane" id="alipayrand">
<img src="http://localhost/waibo/img/alipayrand.png" alt="￥随意"><span>￥随意</span>
</div>
</div>
</div>
<div class="reward-method">
<label><input type="radio" name="method" value="weipay" checked><img src="http://localhost/waibo/img/weipay.png" alt="微信支付"></label>
<label><input type="radio" name="method" value="alipay"><img src="http://localhost/waibo/img/alipay.png" alt="支付宝"></label>
</div>
</div>
</div>
<div class="reward">
<p>如果本教程对您帮助很大，请随意打赏。您的支持，将鼓励我写出更好的教程！</p>
<a data-toggle="modal" href="#modalReward">赏</a>
</div>

<script src="http://localhost/waibo/js/bootstrap.min.js"></script>
 <script>
 $(function() {
    rewardMethod();
 });
 </script>
 
<div class="share">
 <div class="bdsharebuttonbox"></div>
 </div>
 <div class="page">
   <a id="prev" href="http://localhost/waibo/bible/css3/html/7/7.2.2.html" title="&#8592; 键到上一节">« 上一节</a>&#8592; 键盘方向键翻页 &#8594;<a id="next" href="http://localhost/waibo/bible/css3/html/7/7.2.4.html" title="&#8594; 键到下一节">下一节 »</a>
 </div>
 </article>
 </main>
 </div>
 </div>
 <div class="floatPanel">
	 <div class="ctrolPanel">
		 <a href="javascript:;" class="arrow top" onClick="goTop()"><span>返回顶部</span></a>
    <a href="#" class="phone"  data-target="#phone"><span>手机访问</span></a>
    <a href="#" class="wechat" data-target="#wechat"><span>关注微信</span></a>
    <a href="javascript:;" class="arrow bottom" onClick="goBottom()"><span>返回底部</span></a>
  </div>
	<div id="phone" class="popPanel">
		<div class="popPanel-inner">
			<img src="http://localhost/waibo/img/site.png" /><p class="slogan">扫码访问歪脖网</p><p>随时随地，想看就看</p>
		</div>
	</div>
	<div id="wechat" class="popPanel">
		<div class="popPanel-inner">
			<img src="http://localhost/waibo/img/weixin.png" /><p class="slogan">关注歪脖网微信</p><p>分享 web 知识、交流 web 经验</p>
		</div>
	</div>
</div>
 <footer>
 <div class="container hidden-phone">
 <div class="row-fluid">
 <div class="span2">
 <dl>
 </dl>
 </div>
 <div class="span2">
 <dl>
    <dl>
      <dt>教程</dt>
      <dd><a href="http://localhost/waibo/bible/html5/">HTML5宝典</a></dd>
      <dd><a href="http://localhost/waibo/bible/css3/">探究CSS3</a></dd>
      <dd><a href="http://localhost/waibo/bible/json/">JSON 教程</a></dd>
      <dd><a href="http://localhost/waibo/bible/es6/">ES6标准入门</a></dd>
      <dd><a href="http://localhost/waibo/bible/bootstrap2/">Bootstrap教程</a></dd>
      <dd><a href="http://localhost/waibo/bible/xcx/">微信小程序教程</a></dd>
    </dl>
 </dl>
 </div>
 <div class="span2">
 <dl>
    <dl>
     <dt>工具</dt>
     <dd><a href="http://www.waibo.wang/tools/htmlformat">HTML格式化</a></dd>
     <dd><a href="http://www.waibo.wang/tools/cssformat">CSS格式化</a></dd>
     <dd><a href="http://www.waibo.wang/tools/htmlconvert">HTML多功能转换器</a></dd>
     <dd><a href="http://www.waibo.wang/tools/xmltojson">XML和JSON转换工具</a></dd>
     <dd><a href="http://www.waibo.wang/tools/jsconfuse">JS混淆工具</a></dd>
     <dd><a href="http://www.waibo.wang/tools/jsonp">JSON在线解析</a></dd>
     <dd><a href="http://www.waibo.wang/tools/markdown">在线Markdown编辑器</a></dd>
    </dl>
 </dl>
 </div>
 <div class="span2">
 <dl>
    <dl>
     <dt>关注</dt>
    </dl>
    <div class="social">
      <img src="http://localhost/waibo/img/weixin.png" title="扫描二维码，关注歪脖网微信">
<a href="https://weibo.com/leiqikui" title="新浪微博" target="_blank"></a>
<a href="http://t.qq.com/maifang51" title="腾讯微博" target="_blank"></a>
<a href="https://github.com/leiqikui" title="Github" target="_blank"><svg width="24" height="24" version="1.1" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0 0 16 8c0-4.42-3.58-8-8-8z"></path></svg></a>
    </div>
 </dl>
 </div>
 <div class="span2">
 <dl>
    <dl>
     <dt>赞助商</dt>
     <dd><a rel="nofollow" href="https://cloud.tencent.com/redirect.php?redirect=1005&cps_key=2291d007f3b4d08b96c0fc03c4b54499" target="_blank" title="腾讯云提供安全、稳定的云服务器"><img src="http://localhost/waibo/img/logo-qqyun.png"> 腾讯云</a></dd>
     <dd><a rel="nofollow" href="https://s.click.taobao.com/t?e=m%3D2%26s%3DJm1BMj9ta3QcQipKwQzePCperVdZeJviEViQ0P1Vf2kguMN8XjClAjPr0N2Hh94K6bMO9Kiim77lHsPu4n7AVmGhnzSVk4DlmWL0QXDWLBr%2BSLtF1Lx83hmIkXBqRClNTcEU%2BDykfuSM%2BhtH71aX6uIOTs4KMj3yjpOyWSRdiSZDEm2YKA6YIrbIzrZDfgWtwGXLU4WXsy8CZuZoOOkzXFxfvOyje0ynomfkDJRs%2BhU%3D" target="_blank" title="阿里云全民云计算"><img src="http://localhost/waibo/img/logo-aliyun.png">&nbsp; 阿里云</a></dd>
    </dl>
 </dl>
 </div>
 </div>
 </div>
 <hr/>
   <p>Copyright&copy;2017&nbsp;&nbsp;www.waibo.wang All Rights Reserved</p>
   <p>陕ICP备17020676号-1&nbsp;&nbsp;&nbsp;&nbsp;客服QQ：376601179&nbsp;&nbsp;&nbsp;&nbsp;邮箱：376601179#qq.com
 </footer>
 <script src="http://localhost/waibo/js/prettify.js"></script>
 <script>
 $(function() {
    prettyPrint();
    bible();
    load();
 });
 </script>
</body>
</html>
